package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Capitulo;
import comun.Pelicula;
import comun.Serie;
import comun.Usuario;
import comun.ValoracionCapitulo;
import comun.ValoracionPelicula;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorCapitulo;
import logica_de_negocio.gestorPeli;
import logica_de_negocio.gestorSerie;
import logica_de_negocio.gestorUsuario;
import logica_de_negocio.gestorValoracionCapitulo;
import logica_de_negocio.gestorValoracionPelicula;

public class TablaValoracion extends JInternalFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JTable tablaDatos;
	private JButton jbSalir;
	private JScrollPane scrollPane;
	private JPanel jpBotones;
	private HashSet<ValoracionPelicula> vp;
	private HashSet<ValoracionCapitulo> vc;
	private boolean PelCap;
	private int id_p_c;


	public TablaValoracion(boolean PelCap, int id_p_c) {
		// ANADIR PARAMETROS DE BUSQUEDA Filtrar

		super("Valoraciones", true, false, false, false);
		this.setVisible(true);
		this.setSize(900, 700);
		this.PelCap = PelCap;
		this.id_p_c = id_p_c;
		this.subCompo();

	}

	public void subCompo() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA
		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);

		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");

		jpBotones = new JPanel(new FlowLayout());

		jbSalir = new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");

	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();

		if (botonPulsado == jbSalir) {
			this.dispose();
		}
	}

	public void cargar() throws ClassNotFoundException {// Pel->True Cap->False

		if (PelCap) {
			gestorValoracionPelicula gvp = new gestorValoracionPelicula();
			try {
				vp = gvp.getValoradasPel(id_p_c);
			} catch (FaltanDatosEnLaBaseDeDatos e) {
				JOptionPane.showMessageDialog(new Frame(), e.getFalta());
				this.dispose();
			}

		} else {
			gestorValoracionCapitulo gvc = new gestorValoracionCapitulo();
			try {
				vc = gvc.getValoradasCapitulo(id_p_c);
			} catch (FaltanDatosEnLaBaseDeDatos e) {
				JOptionPane.showMessageDialog(new Frame(), e.getFalta());
				this.dispose();
			}

		}

		crearTabla();
		this.setVisible(true);
		this.subCompo();
	}

	public void crearTabla() throws ClassNotFoundException {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);
		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);
		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);
		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();
		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(true);
		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName;
		private Object[][] data;

		public myTable() throws ClassNotFoundException {

			super();
			setData();
			if (PelCap) {
				String[] col = { "Titulo", "Director", "Pais", "Usuario",
						"Comentarios", "Puntuacion" };
				columName = new String[6];
				columName = col;
			} else {
				String[] col = { "Titulo Serie", "Titulo Capitulo", "N Temp",
						"N Cap", "Usuario", "Comentario", "Puntuacion" };
				columName = new String[7];
				columName = col;
			}
		}
		@Override
		public int getColumnCount() {
			return columName.length;
		}
		@Override
		public int getRowCount() {
			return data.length;
		}
		@Override
		public String getColumnName(int col) {
			return columName[col];
		}
		@Override
		public Object getValueAt(int row, int col) {

			return data[row][col];
		}

		public void setData() throws ClassNotFoundException {

			int filas = 0;
			if (PelCap) {
				filas = vp.size();
			} else {
				filas = vc.size();
			}

			int cont = 0;
			data = new Object[filas][];

			if (PelCap) {
				gestorPeli gp = new gestorPeli();
				gestorUsuario gu = new gestorUsuario();
				for (ValoracionPelicula valPel : vp) {

					try {
						Pelicula p = gp.getPelicula(id_p_c);
						Usuario u = gu.getUsuario(valPel.getId_u());
						Object[] a = { p.getTitulo(), p.getDirector(),
								p.getPais(), u.getUsuario(),
								valPel.getComentario(), valPel.getPuntuacion() };
						data[cont] = a;
						cont++;
					} catch (FaltanDatosEnLaBaseDeDatos e) {
					}
				}

			} else {
				gestorCapitulo gc = new gestorCapitulo();
				gestorUsuario gu = new gestorUsuario();
				gestorSerie gs = new gestorSerie();
				for (ValoracionCapitulo valCap : vc) {
					try {
						Capitulo c = gc.getCapitulo(id_p_c);
						Serie s = gs.getSerie(c.getId_s());
						Usuario u = gu.getUsuario(valCap.getId_u());
						Object[] a = { s.getTitulo(), c.getNombre(),
								c.getNum_temp(), c.getNum_cap(),
								u.getUsuario(), valCap.getComentario(),
								valCap.getPuntuacion() };
						data[cont] = a;
						cont++;
					} catch (FaltanDatosEnLaBaseDeDatos e) {
					}
				}
			}
		}
	}
}
